home *** CD-ROM | disk | FTP | other *** search
/ Shareware Games Galore! / Shareware Games Galore!.iso / arcade / corewars / corewars.doc < prev    next >
Text File  |  1989-05-02  |  20KB  |  504 lines

  1.              THE CORE WARS DEVELOPMENT AND SIMULATION SYSTEM
  2.             ───────────────────────────────────────────────────
  3.  
  4.                    IBM PC version, Version 2.1 rev. G
  5.                        Last revision 30-Apr-89
  6.                      By Maz Spork, the DaneBrain
  7.  
  8.                             ──────────
  9.  
  10. ┌─────────────────────────────────────────────────────────────────────────────┐
  11. │ Copyright notice: This software is provided, free of charge, for your       │
  12. │ benefit and pleasure. You are free to give away copies of the programs to   │
  13. │ friends and colleagues, provided:                                   │
  14. │                                                               │
  15. │     - You do not charge any money for the software, distri-               │
  16. │       bution or work associated with copying it.                       │
  17. │     - All parts of the package are retained.                           │
  18. │     - No part of the package is modified, and all copyright               │
  19. │       notices are left in.                                           │
  20. │                                                               │
  21. │ Standard disclaimer: No guarantee follows this software, neither expressed  │
  22. │ nor implied. The author takes no responability for any social, mental,       │
  23. │ physical or dental damage this suite of programs may cause. There is no       │
  24. │ guarantee that the software will be supported either (though chances are).  │
  25. └─────────────────────────────────────────────────────────────────────────────┘                                                                 
  26.  
  27.                 ───────────────────────────────────────
  28.  
  29. The Core Wars Redcode Development and Simulation System disk contains software
  30. to produce and run redcode programs. 
  31.  
  32. Shipping list:
  33.  
  34.             READ.ME        -    This file (I hope)
  35.             RCASM.EXE        -    The Redcode Assembler, converts your
  36.                             source code into executeable format.
  37.             RCDSM.EXE        -    The Redcode Disassembler, allows
  38.                             symbolic printout of executeable code.
  39.             MARS.EXE        -    The Memory Array Redcode Simulator.
  40.             *.RDC        -    A collection of demonstration Redcode
  41.                             programs.
  42.             
  43. The package also contains graphic drivers necessary to run MARS in graphics
  44. mode. I am not absolutely sure I am allowed to include these. In fact, I think
  45. the rules are, that they may be distributed if they are integrated into the
  46. object code, not on their own. However, I write lots of programs, and including
  47. graphic drivers would be a waste.
  48.  
  49. If you own one of the following graphics adaptors, or compatible, you will be
  50. able to view the simulated core in real time as the battle is fought:            
  51.  
  52.         * AT&T graphics adaptor
  53.         * IBM CGA Colour Graphics Adaptor
  54.         * IBM EGA Enhanced Graphics Adaptor
  55.         * IBM VGA Video Graphics Adaptor
  56.         * IBM8514 Graphics Card
  57.         * Hercules Monochrome Graphics
  58.  
  59. If not, MARS will display information in text-format, indicating the status
  60. of each warrior.
  61.  
  62.  
  63.                              Redcode
  64.                             ───────────
  65.  
  66. Assuming you know all about binary numbers, memory logic and machine-code (who
  67. doesn't?), I will briefly talk about Redcode.
  68. Ten instructions are provided, all of which take up 1 memory location. A memory 
  69. location consists of an instruction field, an A-operand field and a B-operand 
  70. field. Redcode addressing modes allow either access to them all in one go, or to 
  71. the B-field alone.
  72.  
  73. The supported instructions are:
  74.  
  75.        DAT   b        Illegal opcode, provides data
  76.        MOV a b        Move data
  77.        ADD a b        Add a to b, result in b
  78.        SUB a b        Subtract b from a, result in b
  79.        JMP a            Jump to a
  80.        JMZ a b        Jump to a if b is zero
  81.        JMN a b        Jump to a if b is non-zero
  82.        DJN a b        Decrement b and jump to a if non-zero
  83.        SPL   b        Spawn child task at location b
  84.  
  85. Assembler directives
  86.  
  87.        EQU n            EQUATE directive
  88.        END            END directive
  89.  
  90. Addressing modes:
  91.  
  92.        $      Direct addressing (this is the assumed mode)
  93.        #      Immediate addressing
  94.        @      Indirect addressing
  95.        <      Indirect with pre-decrement
  96.  
  97. All addressing is PC-relative. This means that a program can make an exact copy 
  98. of itself and transfer execution to that, without any side effects. To further 
  99. explain how the addressing modes interpret the relative addressing scheme, 
  100. consider these examples:
  101.  
  102.         0000:    mov    #0, 1    ; Move a ZERO to the B-FIELD of location 1
  103.         0001:    dat    0        ; This gets altered
  104.         
  105.         0000:    mov    1, 2        ; Move whole location 1 to 2
  106.         0001:    dat    1        ; This value gets moved
  107.         0002:    dat    0        ; to here
  108.         
  109.         0000:    mov    @1, 2    ; Move indirect from loc. 1 to loc 2
  110.         0001:    dat    2        ; This is the indirection, two locs. ahead
  111.         0002:    dat    0        ; This is where cont. of loc. 3 gets copied
  112.         0003:    dat    3        ; This gets moved
  113.  
  114. You probably know all this, though. It is important to realize some of the more 
  115. creative uses of the language, such as savings on program sizes and execution 
  116. times. These are important factors, as the smaller a program is, the harder it 
  117. is to seek down and kill - and the quicker it runs, the faster it will track 
  118. down the enemy. Consider:
  119.  
  120.         0000:    ...
  121.         0001:    DJN    -1, 1
  122.         0002:    JMP    -2
  123.         0003:    ...
  124.         
  125. In this example, the DJN instruction uses the B-field of the JMP-instruction as 
  126. a counter. This field is normally unused. This is the crux of Redcode 
  127. programming (and of Real Programming in general).
  128.  
  129.  
  130.                         The Redcode Assembler
  131.                       ─────────────────────────
  132.  
  133. The Redcode Assembler will convert Redcode source code into MARS-executeable
  134. binary code. It is a two-pass assembler.
  135.  
  136. Command line format:    RCASM <filename(.ext)> (?)
  137.  
  138. The assembler assumes extension .RDC, although you can override this. It will 
  139. produce two files, <filename.MRS> and <filename.LST>, which are the binary, 
  140. executeable file and listing respectively.
  141.  
  142. Source Code format
  143. ──────────────────
  144.  
  145. Each line of source code must have the format:
  146.  
  147.     (label) opcode (m)opA (m)opB ; comment
  148.     
  149. The (label) is a character string of which only 16 characters are stored. It is 
  150. optional, though ceartain directives (eg. EQU) requires it. The label should not 
  151. be followed by a colon, and must start in the first column, before any spaces or 
  152. tabs.
  153. The opcode follows the label as defined in the above section about Redcode in 
  154. general. Likewise, the addresing modes and operands are required in the format 
  155. described in that section.
  156. Here's an example of a well-known warrior called MICE, converted to this 
  157. assembler's format:
  158.  
  159.     ; MICE warrior (from Scientific American, sep. 1985)
  160.     ;
  161.     proglen    equ    dest-ptr        ; length of program without DATs
  162.     disp        equ    3*17+2048/5    ; displacement for replications
  163.     ptr        dat    0            ; counter value
  164.     start    mov    #proglen, ptr    ; initialise counter to length of program
  165.     loop        mov    @ptr, <dest    ; move one location from this to child
  166.             djn    loop, ptr        ; loop for all locations
  167.             spl    @dest        ; spawn child task at the new program
  168.             add    #disp, dest    ; find new place to put a child
  169.             jmz    start, ptr    ; test for distortion; repeat/self-destruct
  170.     dest        dat    disp            ; location of child process
  171.  
  172. Note that the values will all be relative when assembling, with the exception of 
  173. labels, which are absolute. Thus, proglen will be 7 everywhere, but loop will 
  174. depend on the location of usage.
  175. Also note that commas are not necessary, a source code statement might also read
  176.  
  177.     loop        mov    @ptr  <dest
  178.  
  179. If no START label is indicated, the assembler assumes that the program begins 
  180. with the first line of code.
  181.  
  182. Expressions
  183. ───────────
  184.  
  185. The assembler has a full expression evaluator, supporting plus, minus, multiply 
  186. and divide functions. Parantheses are NOT supported. The order of precedence of 
  187. these operators are:
  188.  
  189.     + -    :    0
  190.     * /    :    1
  191.  
  192. as increasing priorities. Expressions are evaluated from left to right unless 
  193. priorities interfere. The operator stack size is 255.
  194. A special operator, !, denotes 'current PC', and can be used in expressions like 
  195. "label-!".
  196.  
  197. Assembler directives
  198. ────────────────────
  199.  
  200. Two directives are supported for flexibility. These are:
  201.  
  202.     EQU    :    Assigns an absolute value to a label
  203.     END    :    Terminates the source code
  204.     
  205. The EQU is useful for specifying ranges within a program under development to 
  206. reduce errors when copying parts of it. Be careful when using EQUated values in 
  207. non-immediate operands, they will not change according to current PC.
  208. END is not necessary, but can be used when some instructions below the end of
  209. the program are not always used.
  210.  
  211. Comments
  212. ────────
  213.  
  214. Comments must be prefixed with a semicolon, and causes the assembler to skip 
  215. characters until the next line. A comment can start anywhere on a line, and a 
  216. line can consist of a comment only.
  217.  
  218. Assembler listing
  219. ─────────────────
  220.  
  221. The assembly listing shows the formatted source code with MARS binary 
  222. instruction fields, line numbers and addresses. A symbol table is also included, 
  223. in which lower-case symbols are relative and upper-case ones are absolute.
  224. Also, statistics about the assembly is put into the listing.
  225.  
  226. Object code
  227. ───────────
  228.  
  229. Object code is generated for reasons of speed in the simulation process. Please 
  230. note that the MARS object code for various systems (mainly 8086 versus 68K) is 
  231. not the same, and thus not compatible.
  232.  
  233. Error messages and warnings
  234. ───────────────────────────
  235.  
  236. Error messages are given in the format "error X in line Y: errortext". The 
  237. errors numbers are:
  238.  
  239.  0: Line too long:            
  240.     A line of source code has exceeded 255 characters,
  241.     which is the maximum number allowed.
  242.             
  243.  1: Invalid opcode:            
  244.     RCASM did not recognize the opcode, and could not
  245.     associate it with an assembler directive either.
  246.  
  247.  2: Invalid expression:
  248.     The expression evaluator could not make sense of the
  249.     expression. This could also be an unknown label. The
  250.     assembler will tell what part of the expression it
  251.     had trouble evaluating.
  252.  
  253.  3: Invalid addressing mode:
  254.     RCASM was unable to determine the meaning of the
  255.     supplied addressing mode.
  256.  
  257.  4: Double definition:
  258.     A label has been defined twice.
  259.  
  260.  5: Start indicator misspelled or missing        
  261.     (not used)
  262.  
  263.  6: Out of stack space
  264.     You have used all stack space for symbols. At present, there is nothing to 
  265.     do about this - execpt removing some labels.
  266.  
  267.  7: Too many errors        
  268.     More than 16 errors were found, and the assembly was aborted.
  269.  
  270.  8: Too few operands
  271.     The opcode needed more operands than were supplied.
  272.  
  273.  9: Immediate addressing not allowed here
  274.     This could be MOVing data from somewhere to an immediate value, which 
  275.     clearly makes little sense. It happens mostly in the B-field, but can also 
  276.     be JuMPing to immediate data.
  277.  
  278. 10: Garbled line or too many operands        
  279.     Unrecognized junk followed the source code statement, or the line is 
  280.     garbeled or corrupted. Or perhaps you've forgotten a semicolon before your 
  281.     comment.
  282.  
  283. 11: Equate directive has no label        
  284.     An EQUate directive was found, but no label was specified to which the 
  285.     result should be assigned.
  286.  
  287. In addition, two warnings exist:
  288.  
  289.  0: No start indicator, first instruction assumed
  290.     Originally an error 5, this warning will just place the START at the first 
  291.     executeable line of code found in the source code.
  292.  
  293.  1: Program size is zero
  294.     This is what happens if you're one of those COBOL-trained programmers, who 
  295.     write so much documentation that they forget all about writing some actual 
  296.     code. Avoid this, you'll lose the battle.
  297.  
  298. The Redcode Assembler takes an optional parameter, ?, which writes a brief list 
  299. of source code formats, allowed opcodes and addressing modes.
  300.  
  301.  
  302.                        The Redcode Disassembler
  303.                      ────────────────────────────
  304.  
  305. This program converts binary MARS-code (.MRS-files) into symbolic redcode 
  306. instructions. The command-line format is:
  307.  
  308.         RCDSM <filename(.ext)> (/a)
  309.  
  310. The disassembly is listed as adresses, object-code and symbolic redcode 
  311. instructions. Also, the START-indicator label is listed where appropriate.
  312. The A switch allows the operands to be displayed as absolute values, enabling 
  313. quicker reference for the viewer.
  314. As the MARS version 1.2 system itself has a built-in core disassembler, the 
  315. usage for this program is a little limited. However, when only the object code 
  316. is known (fx. the opponent's killer warrior), it can be a good utility.
  317.  
  318.  
  319.                    The Memory Array Redcode Simulator
  320.                  ──────────────────────────────────────
  321.  
  322. MARS takes two warriors into its core arena and initiates the battle between 
  323. them until one of them dies, the time runs out or the user breaks in.
  324.  
  325. The command line format is:
  326.  
  327.         MARS <warriorA> <warriorB> (<switches> ...)
  328.         MARS ?
  329.         
  330. The two warriors must be specified, and they must be present on the disk. Do not 
  331. use pathnames in the warrior names, but if the warrior programs' extension 
  332. differ from the standard, you can use the new ones.
  333.  
  334. Execution
  335. ─────────
  336.  
  337. MARS will place the two warriors at random places in the cyclic memory. The 
  338. first program on the command line will be the first program to execute an 
  339. instruction.
  340. The two programs then executes their programs alternately until one of them is 
  341. completely dead. If you have graphics capabilities, you will be able to view the 
  342. core in its entirety.
  343. Dots on the screen does not necessarily denote what memory a program "owns", 
  344. they rather show where a program writes data into memory.
  345.  
  346. Termination
  347. ───────────
  348.  
  349. The battle can terminate in one of three ways:
  350.  
  351.     1. One of the warriors dies
  352.     2. MARS times out the battle
  353.     3. The user breaks off the battle by pressing a key
  354.  
  355. When the program is terminated by the user, a special "TERMINATION HALTED" menu 
  356. is displayed, together with information about the battle status. In this menu, 
  357. you can choose to restart the game from where you left off, you can analyze the 
  358. game, you can disassemble the core or you can terminate the battle.
  359. When the program terminates by either timeout or death, MARS will produce an 
  360. appropriate "POST MORTEM" over the programs, how they performed, and who won. At 
  361. this point, ceartain statistics can also be asked for.
  362. You can ask for a list of where the programs are currently placed in the core, 
  363. and you can list the programs in Redcode statements. The disassembler will 
  364. display the names of the programs' program counters as it goes along. If the 
  365. disassembly is initiated at post-mortem time, the position where the losing 
  366. warrior got killed will be tagged. It is interesting to see how programs 
  367. sometimes have mutated, and how code exist in the core with little or no 
  368. resemblance to what you originally wrote! Speak about AI!
  369. A terminated battle is given a unique signature, enabling an identical run to be 
  370. performed, though this requires identical warriors, timeout values, execution 
  371. modes and core sizes.
  372.  
  373. Command Line Switches
  374. ─────────────────────
  375.  
  376. The command line switches are:
  377.  
  378.     C:    Set Core Size. Maximum is 32767 locations, default is 4096.
  379.     D:    Debug mode - shows all effective addresses and instructions as
  380.         they are executed.
  381.     E:    Set Execution Delay * 100ms. Default is 0.
  382.     G:    Override auto-detection of graphics card (IBM PC only).
  383.     N:    No graphics - use text display only.
  384.     P:    Parallel execution mode.
  385.     S:    Set Battle Signature.
  386.     T:    Set Timer start value. 0 for infinite time. Default 5000 clocks.
  387.     W:    General information
  388.     8:    Use ICWS' CoreWar'88 standard.
  389.  
  390. The switch indicator is either the slash (/) or the dash (-). An example command 
  391. line is:
  392.  
  393.     MARS MICE CHANG1 /T 8000 /P /C 2048
  394.  
  395. which tells MARS to put the warriors MICE and CHANG1 into the arena, set the 
  396. initial timer to 8000, use parallel execution mode and set the default core size 
  397. to 2048 locations.
  398. There is no preorder demands on the switches, and the space between the switch 
  399. and the decimal number on some swiches is optional, eg. /T8000 in the above 
  400. would also be legal.
  401. The /P switch tells MARS to execute the programs in a so-called parallel mode. 
  402. While the standard simulation scheme works with multiple tasks through the SPL 
  403. instructions, this method has a lot of drawbacks. Consider an IMP-STOMPER:
  404.  
  405.     picket    dat    0            ; Test site
  406.     trap        dat    0            ; Trap IMPs here
  407.     bomb        dat    0            ; Bomb value
  408.     start    jmz    start, picket    ; Wait for the picket to change
  409.             mov    bomb, trap    ; Kill the IMP
  410.             jmp    start
  411.  
  412. This nifty little program will detect IMPs as they trash the picket, and 
  413. subsequently kill them at the next location. This is all fine until you want 
  414. this IMP-STOMPER to be just one task at the beginning of a larger program. In 
  415. a split-task situation, the non-parallel method will actually steal execution 
  416. cycles from the IMP-STOMPER, making it not detect the exact time of interception 
  417. by an IMP. This means that it will not function properly, and be killed.
  418. I argue that it should not be the number of tasks running that should determine 
  419. how a program performs. In the real world, you do not move slower when you get 
  420. kids (well, perhaps you do, but that's besides the point!). When stating 
  421. parallel execution mode, EVERY task gets a cycle executed when the program has 
  422. its turn, rather than just ONE task in the sequence. Then the IMP-STOMPER will 
  423. work.
  424. The other creative prospect is how it changes the way redcode warriors are 
  425. designed and written. Much more care has to go into the battle programs, of a 
  426. totally different kind. It is, however, much more solid this way. The 'old' 
  427. method actually only allowed one kind of warrior, the "mutilate as much as 
  428. possible, hopefully overwriting the opponent".
  429.  
  430.  
  431.                         Future enhancements
  432.                        ───────────────────────
  433.  
  434. Here's a brief list of what I just might consider doing if ample interest 
  435. develops into my version of MARS:
  436.  
  437.     * Dynamic stack sizes in RCASM
  438.     * History buffer in MARS to allow 'backtracking' to find out exactly
  439.       what happened up to the point where a program got killed.
  440.     * Infinite number of tasks (or more than 64 anyway).
  441.     * More than 2 warriors?
  442.     * Larger core sizes with disk swapping.
  443.     * When the ICWS finally define a good standard, implement it.
  444.     * Interactively disassembly. Point on the graphic core with the mouse
  445.       and select the location around which you want a disassembly.
  446.  
  447. I sincerely hope that the PARALLEL execution mode will be the new standard.
  448. It allows so much more flexible and WORKING programs to be written, rather
  449. than the only possible effective warrior in the non-parallel version, the
  450. "move and multiply" program. In fact, all good programs are variants of MICE.
  451. Also, I intend to investigate the possibilities of "shadow" tasks, in which
  452. memory is layered to allow a task to work in conjunction on several planes.
  453. This could be extended to make the warriors time-domain independent - ie,
  454. a task on one layer can "see into the future" or "into the past" and decide
  455. what to do next.
  456.  
  457.  
  458.                             Source Code
  459.                           ───────────────
  460.  
  461. If the source code for the various parts of MARS is included in the package, you 
  462. are free to look at it and add to it, though this must happen with the following 
  463. conditions:
  464.  
  465.     - The programs are my copyright, and I have placed them in the Public
  466.       Domain. If you want to enhance or change anything, you have to follow
  467.       me in this. Never must any money be charged for this system of MARS,
  468.       neither in its present form or with any changes made by others.
  469.  
  470.     - You must send me a copy of the enhanced programs.
  471.     
  472. Keeping this in mind, I encourage you to enhance the programs.
  473.  
  474.  
  475.                             Bibliography
  476.                           ────────────────
  477.  
  478. A. K. Dewdney : Core Wars, Scientific American (Computer Recreations), September
  479. 1984 and May 1985
  480.  
  481. Acorn User, The Core War, October 1985
  482.  
  483. M. Spork : Slaget om Siliciummet, DataTid, september 1988
  484.  
  485. The Core War Newsletter, AMRAN Publishing (quarterly publication)
  486.  
  487.  
  488.                             Addresses
  489.                            ─────────────
  490.  
  491. I would very much like some feedback on this software. If you have any comments 
  492. or suggestions, please do write to me.
  493.  
  494.     Maz Spork, Howitzvej 21 (FLAT 2), DK-2000 Frederiksberg
  495.  
  496. The Internation Core War Society can be contacted at:
  497.  
  498.     ICWS, Office of the Secretary (!)
  499.     5712 Kern Drive
  500.     Huntington Beach, CA 92649-4535, USA
  501.  
  502. AMRAN Publishing (The Core War Newsletter) lives at the same address.
  503.  
  504.